<?php
use app\common\model\User;
/*生成token
*/
function createToken($uid, $timestamp)
{
    //$user = new User();
    //$salt = User::where(['id' => $uid])->field('salt')->find();
    //$userSalt = $salt['salt'];
    $cipherText = encrypts($uid . $timestamp, 'E', 'dj');
    $token = base64_encode($uid . '_' . $timestamp . '_' . $cipherText);
    return $token;
}
/**
 * 检测token和有效性
 *
 * @param      string   $token  The token
 *
 * @return     boolean  ( token存在  并且有效 返回 true 否则 返回 false )
 */
function checkToken($token)
{
    $auth = $token;
    $tokens = base64_decode($auth);
    $checkToken = explode('_', $tokens);
    $uid = $checkToken[0];
    if (!is_numeric($uid)) {
        $uid = $checkToken[1];
        //如果用户在不同的浏览器登录失效会报错
        if (!empty($checkToken[0])) {
            @$tokenGame = $checkToken[0];
        } else {
            return false;
        }
    }
    $user = new User();
    $salt = $user->where("id = $uid")->find();
    if (empty($salt)) {
        return false;
    }
    if ($auth == $salt['token']) {
        return true;
    }
    return false;
}
/*********************************************************************
 * 函数名称:encrypt
 * 函数作用:加密解密字符串
 * 使用方法:
 * 加密   :encrypt('str','E','nowamagic');
 * 解密   :encrypt('被加密过的字符串','D','nowamagic');
 * 参数说明:
 * $string  :需要加密解密的字符串
 * $operation:判断是加密还是解密:E:加密  D:解密
 * $key   :加密的钥匙(密匙);
 *********************************************************************/
function encrypts($string, $operation, $key = '')
{
    $key = md5($key);
    $key_length = strlen($key);
    $string = $operation == 'D' ? base64_decode($string) : substr(md5($string . $key), 0, 8) . $string;
    $string_length = strlen($string);
    $rndkey = $box = array();
    $result = '';
    for ($i = 0; $i <= 255; $i++) {
        $rndkey[$i] = ord($key[$i % $key_length]);
        $box[$i] = $i;
    }
    for ($j = $i = 0; $i < 256; $i++) {
        $j = ($j + $box[$i] + $rndkey[$i]) % 256;
        $tmp = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
    }
    for ($a = $j = $i = 0; $i < $string_length; $i++) {
        $a = ($a + 1) % 256;
        $j = ($j + $box[$a]) % 256;
        $tmp = $box[$a];
        $box[$a] = $box[$j];
        $box[$j] = $tmp;
        $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
    }
    if ($operation == 'D') {
        if (substr($result, 0, 8) == substr(md5(substr($result, 8) . $key), 0, 8)) {
            return substr($result, 8);
        } else {
            return '';
        }
    } else {
        return str_replace('=', '', base64_encode($result));
    }
}
    /**
     * 微信支付
     * @param  string   $openId 	openid
     * @param  string   $goods 		商品名称
     * @param  string   $attach 	附加参数,我们可以选择传递一个参数,比如订单ID
     * @param  string   $order_sn	订单号
     * @param  string   $total_fee  金额
     */
    function wxpay($openId,$goods,$order_sn,$total_fee,$attach){
        //echo getcwd();exit;
        require_once getcwd()."/wxpay/lib/WxPay.Api.php";
        require_once getcwd()."/wxpay/example/WxPay.JsApiPay.php";
        require_once getcwd().'/wxpay/example/log.php';

        //初始化日志
        $logHandler= new CLogFileHandler(getcwd()."/wxpay/logs/".date('Y-m-d').'.log');
        $log = Log::Init($logHandler, 15);

        $tools = new JsApiPay();
        if(empty($openId)) $openId = $tools->GetOpenid();

        $input = new WxPayUnifiedOrder();
        $input->SetBody($goods);					//商品名称
        $input->SetAttach($attach);					//附加参数,可填可不填,填写的话,里边字符串不能出现空格
        $input->SetOut_trade_no($order_sn);			//订单号
        $input->SetTotal_fee($total_fee);			//支付金额,单位:分
        $input->SetTime_start(date("YmdHis"));		//支付发起时间
        $input->SetTime_expire(date("YmdHis", time() + 600));//支付超时
        $input->SetGoods_tag("test3");
        //$input->SetNotify_url("http://".$_SERVER['HTTP_HOST']."/payment.php");  //支付回调验证地址
        $input->SetNotify_url("http://".$_SERVER['HTTP_HOST']."/payment.php/WexinApi/WeixinPay/notify");
        $input->SetTrade_type("JSAPI");				//支付类型
        $input->SetOpenid($openId);					//用户openID
        $config = new WxPayConfig();
        $order = WxPayApi::unifiedOrder($config,$input);	//统一下单

        $jsApiParameters = $tools->GetJsApiParameters($order);

        return $jsApiParameters;
}
